#ifndef BINARYTREE_H
#define BINARYTREE_H

#include <iostream>

struct TreeNode;
using NodePtr = TreeNode*;

struct TreeNode {
	int data;
	NodePtr childRight;
	NodePtr childLeft;
	
	TreeNode(int data = 0, NodePtr right = nullptr, NodePtr left = nullptr) 
	: data(data), childRight(right), childLeft(left) { }
};

class BinaryTree {
public:
	// 构造函数（初始化根节点）
	BinaryTree() : root(nullptr) {}
	
	// 析构函数（释放内存）
	~BinaryTree() {
		clear();
	}
	
	// 插入节点
	void insert(int value) {
		root = insertRecursive(root, value);
	}
	
	// 前序遍历
	void preorder() const {
		std::cout << "前序遍历: ";
		preorderRecursive(root);
		std::cout << std::endl;
	}
	
	// 清空树
	void clear() {
		clearRecursive(root);
		root = nullptr;
	}
	
private:
	NodePtr root;
	
	// 递归插入声明
	NodePtr insertRecursive(NodePtr node, int value);
	
	// 递归前序遍历声明
	void preorderRecursive(NodePtr node) const;
	
	// 递归清除声明
	void clearRecursive(NodePtr node);
};

#endif
